/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.edinet.agencialinea3.ejb.facade;

import cl.aperture.commons.ValidationException;
import cl.aperture.commons.xml.XMLControlResponse;
import cl.edinet.agencialinea3.ejb.entity.AelUsuario;
import cl.edinet.agencialinea3.ejb.bean.parametro.ParametroAelUsuario;
import cl.edinet.agencialinea3.ejb.entity.AelEntidad;
import cl.edinet.agencialinea3.ejb.entity.Importador;
import cl.edinet.agencialinea3.ejb.util.UsuarioSession;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.sql.Connection;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.apache.commons.lang.StringUtils;

/**
 *
 * @author ivan
 */
@Stateless
public class AelUsuarioFacade extends AbstractFacade<AelUsuario> {
    @PersistenceContext(unitName = "AgenciaLinea3-ejbPU")
    private EntityManager em;

    @Override
    protected EntityManager getEntityManager() {
        return em;
    }

    public AelUsuarioFacade() {
        super(AelUsuario.class);
    }    
    
    public AelUsuario findByLogin(String usuario, String clave) {
        
        try {
            
            return (AelUsuario) getEntityManager().
                    createNativeQuery("select * from AEL_USUARIO where NIK = '"+usuario+"' and CLAVE = '"+clave+"'", AelUsuario.class).
                    getSingleResult();
            
        } catch(NoResultException e){
            return null;
        } catch (Exception e) {
            Logger.getLogger(AelUsuario.class.getName()).log(Level.SEVERE, null, e);
            return null;
        }
        
    }

    public BigDecimal generateNextId() {
                 return (BigDecimal) getEntityManager().
                createNativeQuery("select SEQ_AEL_USUARIO.nextval from dual").
                getSingleResult();
    }
    
    
    
    public int contarByFiltros(ParametroAelUsuario parametroAelUsuario) throws ValidationException{
        return ((Long) buildQuery(parametroAelUsuario, true).getSingleResult()).intValue();
    }

    public Query buildQuery(ParametroAelUsuario parametroAelUsuario, boolean isContar) throws ValidationException {

        AelUsuario aelUsuario = parametroAelUsuario.getAelUsuario();
        //DatoFecha fechaAceptacionDesde = parametroDeclaracion.getFechaAceptacionDesde();
        //DatoFecha fechaAceptacionHasta = parametroDeclaracion.getFechaAceptacionHasta();
        //TipoOperacion tipoOperacion = parametroDeclaracion.getTipoOperacion();
        UsuarioSession usuarioSession = parametroAelUsuario.getUsuarioSession();
        AelEntidad aelEntidad = parametroAelUsuario.getAelEntidad();
        String usuarioNik = parametroAelUsuario.getNik();
        String usuarioEmail = parametroAelUsuario.getEmail();
        Integer usuarioRut = parametroAelUsuario.getRut();
        String usuarioNombre = parametroAelUsuario.getNombre();
       

        List<String> where = new ArrayList<String>();
        

        boolean isParametroFechaDesde = false;
        boolean isParametroFechaHasta = false;

        String sql = "";

        if (isContar) {
            sql = "select count(a.id) from AelUsuario a ";
        } else {
            sql = "select a from AelUsuario a ";
        }
        
        if(usuarioSession.isEntidad()){
            sql += "left join a.importadorCollection i ";
            List idEntidades = new ArrayList();
            for(Importador i:usuarioSession.getUsuario().getImportadorCollection()){
                idEntidades.add(i.getCodigo());
            }
            where.add("i.codigo in ("+StringUtils.join(idEntidades, ",")+")");
        }
        
        if (usuarioNik!=null){
            where.add("UPPER(a.nik) like UPPER('%"+usuarioNik+"%')");
        } 
        
        if (usuarioEmail!=null){
            where.add("UPPER(a.email) like UPPER('%"+usuarioEmail+"%')");
         }
        if (usuarioRut!=null) {
            where.add("a.rut like '%"+usuarioRut+"%'");
        }
        if ( usuarioNombre!=null) {
            where.add("UPPER(CONCAT(a.nombre,a.apellidoPaterno,a.apellidoMaterno)) like UPPER('%"+usuarioNombre+"%')");
              //where.add("a.nombre.concat(a.apellidoPaterno) like '%"+usuarioNombre+"%'");
        }
        
        //if (aelEntidad != null){
        //    where.add("i.codigo = ");
        //}
             
        if (aelUsuario != null) {
            where.add("a.AelUsuario.id = " + aelUsuario.getId());
        }
        //if (fechaAceptacionDesde != null) {
        //    where.add("d.fechaAceptacion >= :fechaAceptacionDesde");
        //    isParametroFechaDesde = true;
        //}
        //if (fechaAceptacionHasta != null) {
        //    where.add("d.fechaAceptacion <= :fechaAceptacionHasta");
        //    isParametroFechaHasta = true;
        //}
        //if (tipoOperacion != null) {
        //   where.add("d.tipoOperacion.codigo = " + tipoOperacion.getCodigo());
        //}

        if (!where.isEmpty()) {
            sql += " where " + StringUtils.join(where, " and ") + " ";
        }

        Query query;

        if (isContar) {
            query = getEntityManager().createQuery(sql);
        } else {
            query = getEntityManager().createQuery(sql, AelUsuario.class);
            query.setFirstResult(parametroAelUsuario.getRegistrosDesde());
            query.setMaxResults(parametroAelUsuario.getCantidadRegistrosPorPagina());

        }

        //if (isParametroFechaDesde) {
        //    query.setParameter("fechaAceptacionDesde", parametroDeclaracion.getFechaAceptacionDesde().getDate());
        //}
        //if (isParametroFechaHasta) {
        //    query.setParameter("fechaAceptacionHasta", parametroDeclaracion.getFechaAceptacionHasta().getDate());
        //}

        return query;

    }

    public List<AelUsuario> findAllByParametros(ParametroAelUsuario parametrosAelUsuario) throws ValidationException {
        List<AelUsuario> resultList = buildQuery(parametrosAelUsuario, false).getResultList();
        if (resultList != null) {            
        }
        return resultList;
    }

    public AelUsuario findByRut(String rut) {
         AelUsuario aelUsuario = (AelUsuario) getEntityManager().createNativeQuery("select * from AEL_USUARIO where rut=" +rut, AelUsuario.class).getSingleResult();
    return aelUsuario;
    }
    public AelUsuario findByNik (String nik){
        try{
            return (AelUsuario) getEntityManager().
                 createNativeQuery("select * from AEL_USUARIO where nik='" +nik+"'", AelUsuario.class).getSingleResult();
        }catch(NoResultException e){
            return null;
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
        
    }
}
